---------> Furb3T <---------
presenta:
Dongle: primi passi.
Attenzione : il materiale che trovate in questo tutorial � a puro scopo didattico.
Cari studenti, oggi affronteremo un tipo di protezione che ultimamente va per la maggiore: la chiave hardware, in inglese Dongle. Questa protezione consiste in un plug che si inserisce nella porta parallela del computer dove dovrebbe girare quel determinato programma; questo non fa altro che verificare se � inserita questa chiave nella porta ( I problema da superare), dopodich� passer� il controllo alla chiave che verificher� alcuni requisiti ( II problema da superare). Avrete capito, quindi, che per i nostri scopi, in primo luogo bisogner� far vedere al prg la chiave hardware e in secondo luogo dovremmo capire qual � lo schema di protezione che viene elaborato nella chiave per superare quest'altro scoglio. Vorrei fare alcune precisazioni: esistono diversi tipi di chiavi hw, nel momento in cui riconoscete il momento vi suggerisco di andare nel sito dei costruttori di quella chiave e leggere le caratteristiche, ci� vi aiuter� nell'affrontare meglio il problema; altra precisazione: le chiavi hw possono essere delle cose facilissime da bypassare, ma non tutte sono cos� anzi alcune di queste potrebbero svolgere alcune routine del prg, ed in questo caso sarebbe difficile ricostruire tutta la routine, ma il nostro motto � non scoraggiarsi mai, anzi � proprio dalle difficolt� che si matura e si trovano nuove strade da percorrere.
Iniziamo a muoverci!!! Il prg ( molto semplice ) che ho preso come riferimento � CpsWin32 versione 1.15, e lo strumento che utilizzeremo � come al solito Softice. Lanciate il prg e noterete subito che compare una MessageBox che vi dice che non avete la Chiave!!! Qualcuno di voi subito avr� pensato di settare un Bpx MessageBoxA, e l'idea non sarebbe malvagia; tuttavia, noi dobbiamo risolvere i 2 problemi che ho descritto sopra, e settare un Bpx MessageBoxA ci porterebbe troppo avanti nel codice da analizzare. Il nostro interesse � per prima cosa individuare il punto dove viene vista la presenza della chiave, a tal fine dobbiamo settare Bpio -h 378 rw. Bpio vuol dire break point input output settato sulla porta 378 che di solito � la porta parallela (altre volte la porta parallela potrebbe essere la 278). Lanciate il prg e....voil� siete dentro Sice ed esattamente vi troverete all'interno di Sc32w.dll . Disabilitate il Bpio ( Bd *) e premete F12 per ritornare alla call che chiama la dll. Arriverete a questo punto:
00419082 CALL 0056859B ----> chiama la dll e probabilmente inizializza la
00419087 MOV DWORD PTR [EBP-1C], AX chiave. Osservate come nelle
0041908B MOV EDX, DWORD PTR [EBP-1C] istruzioni che
seguono il valore di
0041908E AND EDX, 0000FFFF EDX venga variato
fino a diventare = FFFF, ci�
00419094 TEST EDX,EDX dovrebbe far pensare
che il JZ non dovrebbe essere
00419096 JZ 004190C5 rilevante ai nostri
fini.
Continuiamo
quindi a steppare per vedere cosa succede e se le nostre intuizioni erano giuste:
004190C5 MOV DWORD PTR [0075F5F4], 0000
004190E2 XOR EDX,EDX ---> EDX viene azzerato (Possibile
inizializzazione?)
004190E4 MOV DX, DWORD PTR [0075F5F4] ---> Muove la flag a
Dx
004190EB CMP EDX, DWORD PTR [EBP-18] ---> Cosa � EBP-18?
004190EE JGE 00419159 ---> jump importante
Se andiamo a vedere il valore di EBP-18, ( D EBP-18) vediamo che questo � 5; probabilmente nel check che � stato fatto dalla precendente call � stato rilevato che non c'� la chiave hw e il risultato di questo errore (5) � stato messo in EBP-18. Provate a editare la flag di EBP-18 e al posto di 5 mettete 0 ( 0 perch� � il valore che viene attribuito a EDX), in questo modo avverr� il JGE ma ancora non avremo finito di operare: rimane da risolvere il II problema. Procediamo:
00419159 MOV DWORD PTR [0075F5F4], 003F ---> 3F � di solito l'ammontare di dati da leggere nella chiave,
quindi le nostre ipotesi precedenti erano giuste!!! :)
00419162 PUSH 0075F1E8
00419167 MOV DX, DWORD PTR [0075F5F4]
00419174 CALL 00568595 --> questa call dovrebbe leggere i
dati dalla chiave
00419179 MOV DWORD PTR [EBP-1C], AX --> i dati da Ax
vengono memorizzati in [Ebp-1C]
0041917D MOV DWORD PTR [0075F5F4], 0005
00419186 XOR EAX,EAX ---> inizializza Eax
00419188 MOV AX, DWORD PTR [0075F1E8] ---> Ax = FFFF
0041918E XOR ECX,ECX ---> inizializza Ecx
00419190 MOV CX, DWORD PTR [0075F5F4]
00419197 XOR EDX,EDX ---> inizializza Edx
00419199 MOV DX, DWORD PTR [EBP+2*ECX-28] ---> Dx = 5460h
0041919E CMP EAX,EDX ---> compara Eax a Edx
004191A0 JZ 004191CC ---> Altro jump importante.
Che fortuna!!! il prg compara Eax con Edx, dove Eax riporta l'errore (FFFF) mentre Edx riporta il valore esatto (5460). A questo punto basterebbe cambiare la flag a Eax portandola = 5460 per ottenere il jump che abilita il prg. Provare per Credere!!!!
Ringraziamenti : A tutto il mio gruppo preferito RingZer0.